package _select

import (
	"fmt"
	"time"
)

/** select

什么是 select？
select 语句用于在多个发送/接收信道操作中进行选择。select 语句会一直阻塞，直到发送/接收操作准备就绪。
如果有多个信道操作准备完毕，select 会随机地选取其中之一执行。
该语法与 switch 类似，所不同的是，这里的每个 case 语句都是信道操作。
*/

func Test() {

	// 示例1
	//case1()

	// 示例2
	//case2()
}

// 示例1
func case1() {
	ch1 := make(chan string)
	ch2 := make(chan string)
	go server1(ch1)
	go server2(ch2)

	select {
	case msg1 := <-ch1:
		fmt.Println(msg1)
	case msg2 := <-ch2:
		fmt.Println(msg2)
	}
}

func server1(ch chan<- string) {
	time.Sleep(6 * time.Second)
	ch <- "hello server1"
}

func server2(ch chan<- string) {
	time.Sleep(3 * time.Second)
	ch <- "hello server2"
}

// 示例2
func case2() {
	ch := make(chan string)
	go process(ch)
	for {
		time.Sleep(1000 * time.Millisecond)
		select {
		case msg := <-ch:
			fmt.Println(msg)
			return
		default:
			fmt.Println("default...")
		}
	}
}

func process(ch chan<- string) {
	time.Sleep(10500 * time.Millisecond)
	ch <- "hello process"
}
